#!/usr/bin/env python3
"""
随机空文件生成器
用于生成各种类型的空文件，用于测试目的
"""

import os
import random
import string
from pathlib import Path

# 定义各种文件类型的扩展名
FILE_TYPES = {
    '1': {
        'name': '文档文件',
        'extensions': ['.txt', '.doc', '.docx', '.pdf', '.xls', '.xlsx', '.ppt', '.pptx', '.odt', '.ods', '.odp']
    },
    '2': {
        'name': '图片文件',
        'extensions': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.svg', '.webp', '.ico']
    },
    '3': {
        'name': '音频文件',
        'extensions': ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.wma', '.m4a', '.opus']
    },
    '4': {
        'name': '视频文件',
        'extensions': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm', '.m4v']
    },
    '5': {
        'name': '压缩文件',
        'extensions': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2']
    },
    '6': {
        'name': '可执行文件',
        'extensions': ['.exe', '.msi', '.bat', '.sh', '.py', '.jar', '.apk']
    },
    '7': {
        'name': '代码文件',
        'extensions': ['.c', '.cpp', '.h', '.java', '.js', '.html', '.css', '.php', '.rb', '.go', '.rs', '.swift']
    }
}

def generate_random_name(length=8):
    """
    生成随机文件名
    
    Args:
        length (int): 文件名长度
    
    Returns:
        str: 随机文件名
    """
    letters = string.ascii_lowercase + string.digits
    return ''.join(random.choice(letters) for _ in range(length))

def get_user_selection():
    """
    获取用户选择的文件类型
    
    Returns:
        list: 选中的文件类型扩展名列表
    """
    print("请选择要生成的文件类型（可多选）:")
    for key, value in FILE_TYPES.items():
        print(f"{key}. {value['name']}")
    
    print("输入数字（多个数字用逗号分隔，例如: 1,2,4）:")
    print("输入 'all' 选择所有类型:")
    
    while True:
        try:
            user_input = input("请选择: ").strip()
        except EOFError:
            # 处理conda run等环境下无法读取输入的情况
            print("\n无法读取用户输入，使用默认配置（所有文件类型）")
            selected_extensions = []
            for file_type in FILE_TYPES.values():
                selected_extensions.extend(file_type['extensions'])
            return selected_extensions
        
        if user_input.lower() == 'all':
            # 选择所有类型
            selected_extensions = []
            for file_type in FILE_TYPES.values():
                selected_extensions.extend(file_type['extensions'])
            return selected_extensions
        
        try:
            choices = [choice.strip() for choice in user_input.split(',')]
            selected_extensions = []
            
            for choice in choices:
                if choice in FILE_TYPES:
                    selected_extensions.extend(FILE_TYPES[choice]['extensions'])
                else:
                    print(f"无效选择: {choice}，请重新输入")
                    raise ValueError("无效选择")
            
            return selected_extensions
        except ValueError:
            continue

def get_file_count():
    """
    获取用户指定的文件数量
    
    Returns:
        int: 文件数量
    """
    while True:
        try:
            try:
                count = int(input("请输入要生成的文件数量: "))
            except EOFError:
                # 处理conda run等环境下无法读取输入的情况
                print("\n无法读取用户输入，使用默认数量（10个文件）")
                return 10
                
            if count > 0:
                return count
            else:
                print("文件数量必须大于0，请重新输入")
        except ValueError:
            print("请输入有效的数字")

def get_output_directory():
    """
    获取用户指定的输出目录
    
    Returns:
        str: 输出目录路径
    """
    while True:
        try:
            directory = input("请输入文件生成的目标目录路径: ").strip()
        except EOFError:
            # 处理conda run等环境下无法读取输入的情况
            default_dir = "./test_files"
            print(f"\n无法读取用户输入，使用默认目录: {default_dir}")
            directory = default_dir
            
        if not directory:
            print("目录路径不能为空，请重新输入")
            continue
        
        # 展开用户目录
        directory = os.path.expanduser(directory)
        
        # 检查目录是否存在，如果不存在则创建
        if os.path.exists(directory):
            if os.path.isdir(directory):
                return directory
            else:
                print(f"路径 '{directory}' 已存在但不是目录，请重新输入")
        else:
            try:
                os.makedirs(directory, exist_ok=True)
                print(f"已创建目录: {directory}")
                return directory
            except Exception as e:
                print(f"无法创建目录 '{directory}': {e}")
                print("请重新输入")

def create_empty_files(directory, extensions, count):
    """
    在指定目录中创建空文件
    
    Args:
        directory (str): 目标目录
        extensions (list): 文件扩展名列表
        count (int): 要创建的文件数量
    """
    print(f"\n开始在 '{directory}' 中生成 {count} 个空文件...")
    
    created_count = 0
    for i in range(count):
        # 随机选择一个扩展名
        extension = random.choice(extensions)
        
        # 生成随机文件名
        filename = generate_random_name() + extension
        filepath = os.path.join(directory, filename)
        
        try:
            # 创建空文件
            with open(filepath, 'w') as f:
                pass  # 创建空文件，不写入任何内容
            
            print(f"✅ 已创建: {filename}")
            created_count += 1
        except Exception as e:
            print(f"❌ 创建文件失败 '{filename}': {e}")
    
    print(f"\n✅ 完成! 成功创建 {created_count}/{count} 个文件")

def main():
    """
    主函数
    """
    print("=" * 50)
    print("🎲 随机空文件生成器")
    print("用于生成各种类型的空文件，适用于测试场景")
    print("=" * 50)
    
    # 获取用户选择的文件类型
    selected_extensions = get_user_selection()
    
    # 获取文件数量
    file_count = get_file_count()
    
    # 获取输出目录
    output_directory = get_output_directory()
    
    # 创建空文件
    create_empty_files(output_directory, selected_extensions, file_count)
    
    print("\n🎉 所有文件已生成完毕!")

if __name__ == "__main__":
    main()